Repository navigation
perf(screenshot): Avoid redundant buffers and copies in screenshot uploads - #635
Open
tintinhamans wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
CaptureScreenshotcreated a display-sized image surface and read the whole front buffer into it on every capture, then never used it: the pixels come from the back buffer copy. That is a full GPU to CPU readback and a 29 MB surface at 5120x1440 per capture, and the capture also failed wheneverGetFrontBufferdid. This removes it.The worker thread now packs BGRA to RGB in place in the buffer it already owns instead of allocating a second full-size image, keeps the resized image in a vector and frees the full-size capture once it is resized, and reserves the JPEG output buffer up front. The encoded bytes are moved instead of copied through the match-start cache, the pending upload list (whose loop copied every entry each tick) and into the S3 PUT request.
It also drops an
Unlock()on the back buffer, which is never locked.UnlockRectfails on it withD3DERR_INVALIDCALL, whichDX8_ErrorCodeturns into aWWASSERT(0), so debug builds asserted on every capture.